2장. 거대 모델은 어떻게 만들어지나
출처: 『AI 엔지니어링』(Chip Huyen 지음) | 원서: AI Engineering (O'Reilly) — 본 입문판은 2장 PDF 원문에서 직접 풀어 썼다.
코드는 분위기만 — Python·수식·import 같은 말은 몰라도 됩니다. '비유'와 '위험'만 봐도 충분해요.
이 장은 "남이 만든 거대 모델, 그 안에서 무슨 결정들이 오갔길래 이 모델은 이걸 잘하고 저건 못 하는가"를 본다.
우리가 모델을 만들 일은 없다.
하지만 어떤 모델을 고를지 정하려면, 그 모델이 어떤 재료와 결정으로 빚어졌는지 대충은 알아야 한다.
천천히 읽으면 된다. 어려운 수식은 다 건너뛰어도 된다.
0. 이 장의 새 단어 (0장에 없는 말만 3개)
0장 용어집에 있는 말(파운데이션 모델·토큰·파인튜닝·환각 등)은 그대로 쓴다.
이 장에서 처음 나오는, 꼭 필요한 말 3개만 여기 풀어 둔다.
어텐션(attention)
한 문장 뜻 — 모델이 다음 말을 만들 때, 앞에 나온 단어들 중 어디를 얼마나 봐야 할지 정하는 장치.
일상비유 — 시험 볼 때 오픈북. 모든 페이지를 똑같이 보는 게 아니라, 지금 푸는 문제와 관련 깊은 페이지를 골라 더 집중해서 본다.
한 줄 예 —
# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 다음 단어를 고를 때 앞 단어마다 "집중도" 점수를 매김
focus = {"How": 0.1, "are": 0.2, "you": 0.7} # you 에 가장 집중
온도(temperature)
한 문장 뜻 — 모델의 대답을 얼마나 뻔하게 vs 얼마나 엉뚱하게 만들지 정하는 손잡이 하나.
일상비유 — 주사위에 손대기. 온도가 낮으면 늘 같은 면이 나오게 눌러 둔 주사위(뻔함), 높으면 어떤 면이든 잘 나오는 공정한 주사위(엉뚱함).
한 줄 예 —
# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 온도 낮음 = 늘 가장 무난한 답 / 온도 높음 = 가끔 튀는 답
answer = model.ask("색깔 추천", temperature=0.2) # 거의 매번 "파란색"
사후 학습(post-training)
한 문장 뜻 — 인터넷 글로 갓 학습을 마친 거친 모델을, 사람 말 잘 듣게 한 번 더 다듬는 단계.
일상비유 — 신입 재교육. 책은 많이 읽었지만 손님 응대는 엉망인 신입에게, 대화법과 회사 규칙을 따로 가르치는 것.
한 줄 예 —
# 1단계: 인터넷 글로 학습한 거친 모델 → 2단계: 사람 말 듣게 다듬기
# 답변을 생성할 LLM 클라이언트나 모델 설정을 준비합니다.
raw_model = pretrain(internet_text)
polite_model = post_train(raw_model) # 대화·예의 추가
(귀납 도입) 이런 적 있죠?
같은 AI에게 한국어로 물으면 척척 답하는데, 잘 안 쓰는 언어로 물으면 갑자기 바보가 된다.
같은 질문을 두 번 했는데 답이 매번 다르다.
분명히 모르는 걸 모른다고 안 하고 술술 지어낸다.
이게 다 "이 모델이 어떻게 만들어졌는가"에서 나오는 현상이다.
모델은 마법 상자가 아니다.
어떤 글로 배웠고, 속을 어떻게 짰고, 어떻게 다듬었고, 답을 어떻게 고르는지 — 이 네 가지가 모든 걸 정한다.
이 장은 그 네 가지를 차례로 본다.
이 장에서 딱 4가지만
이 장의 큰 줄기 4개
- 무슨 글로 배웠나 (학습 데이터) — 모델은 배운 것만 한다. 인터넷에 영어가 절반이라, 모델도 영어를 제일 잘한다.
- 속을 어떻게 짰나 (아키텍처) — 요즘 모델 속은 거의 다 '트랜스포머'다. 핵심 장치는 어텐션 하나.
- 어떻게 다듬었나 (사후 학습) — 갓 배운 모델은 거칠다. 사람 말 듣게 한 번 더 가르친다.
- 답을 어떻게 고르나 (샘플링) — 모델은 다음 말을 확률로 뽑는다. 이 '뽑기'가 창의성도, 헛소리도 만든다.
각 줄기를 하나씩 본다.
지금은 4개 제목만 머리에 넣어도 된다.
1. 무슨 글로 배웠나 — 학습 데이터
1.1 모델은 배운 것만 한다
망가지는 장면
학습할 때 한국어를 한 줄도 안 본 모델에게 한국어 번역을 시킨다.
당연히 못 한다. 본 적이 없으니까.
동물 사진만 보고 자란 모델에게 식물 사진을 보여주면, 그것도 못 알아본다.
일상비유
요리사는 배운 요리만 한다.
한식만 배운 요리사에게 갑자기 정통 프랑스 코스를 시키면 흉내만 낼 뿐이다.
모델도 똑같다. 학습 데이터에 없던 일은 못 한다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 한식만 배운 요리사 | model.train(korean_only) |
안 배운 언어·분야는 못 함 |
| 메뉴에 있는 것만 주문 가능 | model.ask("한국어 번역") → 학습에 한국어 있어야 작동 |
"AI니까 다 되겠지" 착각 |
한 문장 정의 — 모델이 할 수 있는 일의 한계는 학습 데이터가 정한다. 안 배운 건 못 한다.
그래서 모델을 고르기 전, "이 모델이 무슨 글로 배웠나"를 보는 게 첫 단추다.
1.2 데이터는 어디서 오나 — 커먼 크롤
거대 모델 하나 학습시키려면 글이 어마어마하게 많이 필요하다.
그 많은 글을 어디서 구할까? 대부분 커먼 크롤(Common Crawl) 에서 온다. (0장 용어집 참고)
비영리 단체가 인터넷 웹페이지를 통째로 긁어 만든 거대한 글 더미다.
2022~2023년엔 매달 약 20~30억 개의 웹페이지를 긁었다.
구글은 이걸 한 번 거른 깨끗한 버전 C4 를 따로 만들었다.
여기서 망가지는 장면
커먼 크롤은 인터넷을 통째로 퍼 온 거라, 흙탕물도 같이 들어온다.
가짜 뉴스, 음모론, 혐오 글까지 다 섞여 있다.
워싱턴 포스트 조사로는, 가장 많이 긁힌 1,000개 사이트에 신뢰도 낮은 언론사가 여럿 끼어 있었다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 강물 통째로 퍼 온 물탱크 | data = common_crawl # 수십억 페이지 |
가짜 뉴스·혐오 글도 같이 학습됨 |
| 그냥 마시기 전에 한 번 거름 | clean = C4 # 구글이 거른 버전 |
걸러도 흙탕물이 완전히 안 빠짐 |
그래서 일부 팀은 거름망(휴리스틱)을 쓴다.
오픈AI는 GPT-2 학습 때 레딧에서 추천 3개 이상 받은 글만 썼다. (그래도 완벽하진 않다.)
1.3 양보다 품질
흔한 착각
"글을 많이 먹일수록 똑똑해지겠지?"
꼭 그렇지 않다.
적은 양이라도 좋은 글로 배운 모델이, 많은 양의 허접한 글로 배운 모델을 이기기도 한다.
예시 폭격 ① (완성예)
구나세카르(Gunasekar) 연구(2023): 좋은 코딩 글 70억 토큰으로 배운 작은 모델(13억 파라미터)이, 훨씬 큰 모델들을 코딩 시험에서 이겼다.
작지만 좋은 재료로 배운 쪽이 이긴 것이다.
예시 폭격 ② (부분완성 — 빈칸 채우기)
# 빈칸: 어느 쪽이 더 좋은 모델일까?
# 모델을 조금 더 가르치거나 학습 설정을 준비합니다.
model_A = train(data="좋은 글 조금")
# 모델을 조금 더 가르치거나 학습 설정을 준비합니다.
model_B = train(data="허접한 글 잔뜩")
# 정답: 상황 따라 A 가 이길 수 있다 (양 != 품질)
| 비유 | 코드 | 위험 |
|---|---|---|
| 좋은 재료 적게 vs 허접한 재료 많이 | train(few_good) vs train(many_bad) |
"많이 = 좋음" 단정은 틀림 |
한 문장 정의 — 데이터는 양만큼 품질이 중요하다. 좋은 글 적게가 허접한 글 많이를 이길 수 있다.
1.4 영어는 잘하고 다른 언어는 못한다 — 다국어 불균형
망가지는 장면
같은 AI인데, 영어로 물으면 똑똑하고 잘 안 쓰는 언어로 물으면 갑자기 멍청해진다.
왜? 인터넷 글의 절반이 영어라서 그렇다.
커먼 크롤을 분석했더니(Lai et al., 2023):
| 언어 | 인터넷 글 비중 | 한마디로 |
|---|---|---|
| 영어 | 45.88% | 거의 절반. 압도적 |
| 러시아어 | 5.97% | 2위인데도 영어의 8분의 1 |
| 독일어 | 5.88% | |
| 중국어 | 4.87% | 쓰는 사람은 제일 많은데 글은 적음 |
데이터가 너무 적은 언어를 저자원 언어(low-resource language) 라고 부른다.
쓰는 사람은 많은데 인터넷 글은 턱없이 적은 언어들이다.
| 언어 | 쓰는 사람 | 인터넷 글 비중 | 사람 수 대비 글 부족 |
|---|---|---|---|
| 펀자브어 | 1.13억 명 | 0.0061% | 231배 부족 |
| 스와힐리어 | 0.71억 명 | 0.0077% | 115배 부족 |
| 벵골어 | 2.72억 명 | 0.0930% | 37배 부족 |
그래서 무슨 일이 벌어지나 (예시 폭격)
예시 ① — GPT-4는 영어 시험(MMLU)은 잘 보지만, 텔루구어·펀자브어 같은 저자원 언어에선 점수가 뚝 떨어졌다.
예시 ② — 예니 준의 실험에서 GPT-4는 같은 수학 문제를 영어로 아르메니아어·페르시아어보다 3배 잘 풀었고, 버마어·암하라어로는 6문제 전부 틀렸다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 모국어는 술술, 외국어는 더듬 | ask("...", lang="en") 잘함 / lang="my") 못함 |
저자원 언어 서비스는 성능이 낮음 |
한 문장 정의 — 인터넷 글이 영어에 쏠려 있어, 모델도 영어를 제일 잘하고 데이터 적은 언어는 못한다.
1.5 그냥 영어로 번역해서 쓰면 안 되나? — 그리고 비용 함정
해보고 싶은 생각
"그럼 다른 언어 질문을 영어로 번역해서 묻고, 답을 다시 번역하면 되잖아?"
많이들 그렇게 하지만, 함정이 있다.
함정 ① — 번역 중에 정보가 샌다. 베트남어엔 상대와의 관계를 담은 호칭이 있는데, 영어로 바꾸면 다 I와 you가 되어 그 관계가 사라진다.
함정 ② — 언어마다 모델 행동이 다르다. 뉴스가드 조사(2023.4)에서 초기 챗GPT는 영어로는 거짓 정보 요청을 거의 거부했지만(7번 중 1번만 생성), 중국어로는 7번 모두 생성했다.
비용 함정 — 토큰화 효율
같은 뜻을 전해도 언어마다 토큰(레고 블록) 개수가 다르다.
| 언어 | 한 문장당 토큰 수 | 영어 대비 |
|---|---|---|
| 영어 | 7개 | 기준 |
| 힌디어 | 32개 | 약 4.5배 |
| 버마어 | 72개 | 약 10배 |
토큰이 10배면, 처리 시간도 약 10배, 토큰당 돈 받는 API에선 요금도 약 10배다.
# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 같은 인사말인데 토큰 수가 다름 → 비용도 다름
cost_english = tokens(7) # 싸고 빠름
cost_burmese = tokens(72) # 약 10배 비싸고 느림
한 문장 정의 — 단순 영어 번역은 정보 손실과 언어별 행동 차이가 있고, 저자원 언어는 토큰이 많아 비용도 최대 10배 더 든다.
1.6 전문 분야 모델 — 도메인 특화
망가지는 장면
범용 모델(챗GPT 같은)은 코딩·법률·스포츠 등 웬만한 건 다 한다.
그런데 신약 개발이나 암 검사처럼 인터넷에 거의 없는 전문 데이터가 필요한 일은 못한다.
단백질·DNA 데이터, X선·MRI 영상은 인터넷에서 못 구하거나 개인정보라 막혀 있다.
그래서 전문 데이터로 따로 키운 모델들 (예시 폭격)
- 딥마인드 알파폴드(AlphaFold) — 단백질 10만 개 구조로 배운 단백질 전문 모델
- 엔비디아 바이오네모(BioNeMo) — 신약 개발용 생체분자 전문 모델
- 구글 메드팜2(Med-PaLM 2) — 의료 질문 답변 전문 모델
- 건축 스케치 모델 — 일반 그림 모델보다 건축가 작업을 훨씬 잘 도움
| 비유 | 코드 | 위험 |
|---|---|---|
| 만능 의사 vs 전문의 | general.ask("단백질 구조?") 약함 / alphafold.ask(...) 강함 |
범용 모델은 전문 영역에서 약함 |
한 문장 정의 — 범용 모델이 못 닿는 전문 영역은, 그 분야 데이터로 따로 키운 도메인 특화 모델이 맡는다.
2. 속을 어떻게 짰나 — 트랜스포머
2.1 옛날 방식의 두 가지 답답함 (seq2seq)
망가지는 장면
트랜스포머 이전엔 seq2seq 라는 방식이 번역을 맡았다.
구조는 둘이다. 입력을 읽는 쪽(인코더)과 답을 쓰는 쪽(디코더).
그런데 답답한 점이 둘 있었다.
답답함 ① — 요약본만 보고 답함. 입력 문장 전체를 딱 하나의 '요약 메모'로 압축한 뒤, 답 쓰는 쪽은 그 메모만 본다. 긴 글일수록 정보가 샌다.
답답함 ② — 줄 서서 처리해 느림. 단어를 한 개씩 순서대로만 처리한다. 입력이 200단어면 200번 줄 서서 기다려야 한다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 책 전체를 한 줄 요약만 보고 답함 | summary = compress(book) → answer(summary) |
긴 입력에서 정보 손실 큼 |
| 한 명씩 줄 세워 처리 | for word in input: process(word) |
긴 글에서 느림 |
한 문장 정의 — 옛날 seq2seq는 입력을 요약 하나로 뭉쳐 정보를 잃었고, 한 개씩 줄 세워 처리해 느렸다.
2.2 어텐션이 두 답답함을 한 번에 푼다
해결 장면
트랜스포머는 어텐션(0장에 없던 말, 이 장 새 단어 참고) 하나로 두 답답함을 다 풀었다.
요약 메모만 보는 게 아니라, 답을 쓸 때마다 원본 페이지를 골라 본다.
그리고 단어를 줄 세우지 않고 한꺼번에(병렬) 처리한다.
어텐션은 세 가지 부품으로 돌아간다 (책 찾기 비유)
| 부품 | 역할 | 도서관 비유 |
|---|---|---|
| Q (쿼리) | 지금 내가 찾는 것 | 자료 찾으러 온 사람 |
| K (키) | 각 단어의 이름표 | 책의 색인(페이지 번호) |
| V (값) | 각 단어의 실제 내용 | 그 페이지의 내용 |
찾는 사람(Q)이 색인(K)을 훑어 "이 페이지가 관련 깊네" 점수를 매기고, 점수 높은 페이지의 내용(V)을 더 많이 가져다 답을 만든다.
예시 폭격
예시 ① (완성예) — "How are you ?"를 번역할 때, 다음 단어를 만들며 모델은 네 단어 each에 집중도 점수를 매긴다.
# Q(찾는 중) 가 단어마다 집중도 점수를 매김
# 여러 값을 이름표가 붙은 구조로 묶어 전달합니다.
focus = {"How": 0.1, "are": 0.2, "you": 0.6, "?": 0.1}
# you 에 가장 집중 → 답에 "너" 관련 내용 더 반영
예시 ② (부분완성) — 빈칸: 어텐션 점수가 높은 단어는 답에 ___ 반영된다. 정답: 더 많이.
| 비유 | 코드 | 위험 |
|---|---|---|
| 오픈북 — 관련 페이지 골라 봄 | score = match(Q, K) → answer += score * V |
단어 많을수록 봐야 할 색인도 늘어 무거워짐 |
한 문장 정의 — 어텐션은 답을 만들 때 앞 단어마다 집중도를 매겨(Q·K·V) 관련 깊은 곳을 골라 보게 하는 장치이며, 트랜스포머의 심장이다.
2.3 긴 글이 부담스러운 이유
어텐션엔 약점도 있다.
앞 단어마다 이름표(K)와 내용(V)을 다 들고 있어야 한다.
글이 길어질수록 들고 있을 게 산더미처럼 늘어난다.
그래서 트랜스포머는 한 번에 다룰 수 있는 글 길이를 늘리기가 어렵다.
# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 단어가 늘면 저장할 이름표·내용도 그만큼 늘어남
memory = len(words) * (key_size + value_size) # 길수록 무거움
한 문장 정의 — 단어마다 이름표·내용을 저장해야 해서, 글이 길어질수록 트랜스포머는 무거워진다.
2.4 트랜스포머 한 블록 안에는 뭐가 있나
트랜스포머는 똑같은 블록을 여러 층 쌓아 만든다.
블록 하나에는 두 부품이 들어 있다.
- 어텐션 부품 — 방금 본 Q·K·V로 어디를 볼지 정함
- MLP 부품(다층 퍼셉트론) — 본 내용을 한 번 더 버무려 패턴을 뽑음. 사이사이 단순한 '꺾기 함수'(ReLU 등)를 끼운다
한 걸음 더 ▸ (지금 몰라도 됨) — 왜 꺾기 함수가 단순할수록 좋을까? 모델엔 직선을 한 번 꺾어 줄 장치만 있으면 충분하다. 화려한 함수는 계산만 무겁고 더 똑똑해지진 않더라는 게 밝혀졌다. 단순한 게 빨라서 더 좋다.
블록을 몇 층 쌓았는지를 그 모델의 '레이어 수'라고 부른다.
층이 깊고 부품이 클수록 모델이 커진다.
# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 같은 블록을 N 층 쌓음
model = [TransformerBlock() for _ in range(N)] # N 이 곧 레이어 수
한 문장 정의 — 트랜스포머는 어텐션+MLP로 된 블록을 여러 층 쌓은 구조다.
2.5 답을 만드는 두 박자 — 읽기와 쓰기
트랜스포머가 답을 낼 때는 두 박자로 움직인다.
- 읽기(프리필) — 입력을 한꺼번에 쭉 읽는다. 빠르다 (병렬).
- 쓰기(디코드) — 답은 한 글자씩 차례로 쓴다. 느리다 (순차).
| 비유 | 코드 | 위험 |
|---|---|---|
| 문제지는 한눈에 훑고 | read_all(input) # 한꺼번에 |
— |
| 답안은 한 글자씩 적음 | for _ in answer: write_one() |
답이 길수록 느리고 비쌈 |
한 문장 정의 — 트랜스포머는 입력은 한꺼번에 읽고, 답은 한 글자씩 쓴다. 그래서 긴 답일수록 느리다.
2.6 트랜스포머 말고 다른 속은 없나
트랜스포머가 2017년부터 줄곧 대세지만, 도전자도 있다.
- RWKV — RNN을 병렬로 학습하게 손본 것. 이론상 글 길이 제한이 없다 (실제로 긴 글을 잘한다는 보장은 별개).
- 맘바(Mamba) — 긴 글 다루기에 강하다. 같은 크기 트랜스포머보다 낫고, 글이 길어져도 부담이 천천히 는다(트랜스포머는 제곱으로 확 늘어난다).
- 잠바(Jamba) — 트랜스포머와 맘바를 번갈아 쌓은 혼합형. 메모리를 덜 쓰면서 긴 글을 잘 본다.
다만 트랜스포머는 2017년부터 갈고닦여서, 이걸 넘어서는 새 구조를 만들기는 쉽지 않다.
한 문장 정의 — 트랜스포머가 지배적이지만 맘바·잠바 같은 도전자가 등장 중이며, 특히 긴 글 처리에서 가능성을 보인다.
3. 모델 크기 이야기 — 숫자 세 개
3.1 크기를 말하는 세 숫자
"이 모델 13B래" 할 때 그 숫자가 뭘 뜻하는지 보자.
| 숫자 | 뜻 | 비유 |
|---|---|---|
| 파라미터 수 | 모델의 '머리 용량' (예: 라마-13B = 130억 개) | 라디오 다이얼 개수 (0장 참고) |
| 학습 토큰 수 | 얼마나 많이 읽었나 | 읽은 책 권수 |
| FLOPs 수 | 학습에 든 계산량 = 비용 | 들인 전기요금 |
라마는 점점 더 많이 읽었다. 라마1은 1.4조 토큰, 라마2는 2조, 라마3는 15조 토큰.
파라미터로 메모리 어림하기 (예시 폭격)
예시 ① — 70억(7B) 파라미터 모델, 한 개당 2바이트면 → 약 14GB GPU 메모리가 필요하다.
# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
gpu_memory = 7_000_000_000 * 2 # = 14GB (최소치)
예시 ② — 빈칸: 파라미터가 2배면 필요한 메모리도 대략 ___ 배. 정답: 2배.
한 문장 정의 — 모델 크기는 파라미터 수(용량)·학습 토큰 수(읽은 양)·FLOPs(비용) 세 숫자로 말한다.
3.2 전문가 여럿을 두되 한 명만 부른다 — MoE
아이디어
파라미터가 많으면 똑똑하지만 무겁다.
그런데 전문가 혼합(MoE) 은 영리하다.
전문가를 여럿 두되, 질문 하나엔 그중 몇 명만 깨워 쓴다.
예시 폭격 — 믹스트랄 8x7B
전문가 8명, 총 467억 파라미터.
하지만 질문 하나엔 8명 중 2명만 깬다 → 실제로는 129억 파라미터만 일한다.
즉 큰 모델을 들고 있으면서, 비용·속도는 작은 모델처럼 쓴다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 전문가 8명 중 2명만 호출 | experts[8] 보유, 호출은 pick(2) |
전체 크기만 보면 비용을 오해함 |
한 문장 정의 — MoE는 전문가를 여럿 두되 매번 일부만 깨워, 큰 모델을 작은 비용으로 쓰는 방식이다.
3.3 예산에 맞는 최적 크기 — 친칠라 규칙
망가지는 장면
"돈은 정해졌는데, 모델을 얼마나 크게, 데이터를 얼마나 많이 넣어야 가장 좋을까?"
무작정 키우면 돈이 터진다.
딥마인드가 모델 400개를 실험해 답을 찾았다 (친칠라 규칙, 2022).
핵심 한 줄: 읽을 토큰 수 = 파라미터 수 × 20.
| 비유 | 코드 | 위험 |
|---|---|---|
| 그릇 크기에 맞게 밥 양 정하기 | tokens = params * 20 |
모델만 키우고 데이터 안 늘리면 헛똑똑이 |
예시 폭격
예시 ① (완성예) — 30억 파라미터 모델 → 30억 × 20 = 600억 토큰을 읽혀야 균형이 맞는다.
예시 ② (부분완성) — 빈칸: 10억 파라미터 모델은 약 ___ 토큰. 정답: 200억 (10억 × 20).
다만 이 규칙은 '학습 비용'만 최적으로 맞춘다.
라마는 일부러 규칙보다 작게 만들었다. 작아야 나중에 쓸 때 싸고 다루기 쉬워서다.
한 문장 정의 — 친칠라 규칙은 정해진 예산에서 토큰을 파라미터의 약 20배 읽히는 게 균형이라고 말한다.
3.4 더 못 키우게 막는 벽 두 개
지금까진 크게 만들수록 좋았다. 그런데 곧 벽에 부딪힌다.
벽 ① — 데이터 부족. 모델이 글을 먹는 속도가 새 글이 생기는 속도보다 빠르다. 게다가 레딧·스택오버플로 같은 곳이 "우리 글 긁어가지 마"로 약관을 바꿔서, 인기 데이터 C4의 상당 부분이 막혔다.
벽 ② — 전기 부족. 데이터센터가 이미 전 세계 전기의 1~2%를 먹는다. 2030년엔 4~20%까지 갈 수 있다.
# 데이터·전기가 모자라면 더 못 키움
# 조건을 확인해서 상황에 맞는 처리 경로를 고릅니다.
if not enough(data) or not enough(power):
# 준비한 함수나 객체를 호출해 예제의 핵심 동작을 실행합니다.
scaling.stop()
한 걸음 더 ▸ (지금 몰라도 됨) — AI가 만든 글로 새 AI를 또 학습시키면 성능이 점점 망가질 수 있다는 '모델 붕괴' 걱정도 있다. 지금은 "데이터와 전기가 한계"만 알면 된다.
한 문장 정의 — 모델 키우기를 막는 두 벽은 학습할 데이터 고갈과 전기 부족이다.
4. 어떻게 다듬었나 — 사후 학습
4.1 갓 배운 모델의 두 가지 문제
망가지는 장면
인터넷 글로 막 학습을 마친 모델에게 "피자 만드는 법"이라고 입력한다.
답을 안 한다. 대신 "여섯 식구를 위한?" 하고 문장을 이어 쓴다.
왜? 이 모델은 '대화'가 아니라 '글 이어 붙이기'만 배웠기 때문이다. (0장 척추 1 참고)
문제 ① — 대화가 아니라 완성을 한다.
문제 ② — 인터넷 흙탕물을 먹어서, 혐오·차별·거짓을 그대로 뱉을 수 있다.
이 둘을 고치는 단계가 사후 학습(이 장 새 단어 참고)이다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 책만 읽은 신입 — 응대 못함 | raw.ask("피자 만드는 법") → 문장만 이어 씀 |
그냥 쓰면 거칠고 위험함 |
사후 학습은 두 단계로 다듬는다. 4.2와 4.3에서 본다.
참고로 다듬는 데 드는 계산은 처음 학습의 약 2%뿐이다 (적은 손질로 큰 효과).
한 문장 정의 — 갓 배운 모델은 대화를 못 하고 거칠어서, 사후 학습으로 두 번 다듬는다.
4.2 1단계 — 좋은 답을 보여 주며 가르치기 (SFT)
비유 먼저
운전 가르치기. 옆에서 "이럴 땐 이렇게" 모범을 보여 주면, 배우는 사람이 그걸 따라 한다.
모델도 똑같다. (질문, 좋은 답) 짝을 잔뜩 보여 주면 그 패턴을 따라 한다.
이걸 SFT(지도 파인튜닝) 또는 '행동 복제'라고 한다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 모범 답안 보여 주고 따라하게 | model.learn([(질문, 좋은답), ...]) |
답을 만드는 사람(레이블러)이 똑똑해야 함 |
예시 폭격 — 이거 비싸다
예시 ① — 좋은 답을 쓰는 사람(레이블러)은 아무나 안 된다. 인스트럭트GPT 작업자의 약 90%가 대학 졸업 이상, 3분의 1이 석사였다.
예시 ② — (질문, 답) 한 짝에 약 10달러. 1만 3천 짝이면 약 13만 달러. 비싸다.
예시 ③ — 돈 없는 곳은 자원봉사로 모은다(LAION). 하지만 봉사자의 90%가 남성이라 편향이 생겼다.
한 문장 정의 — SFT는 (질문, 좋은 답) 모범을 보여 주며 대화법을 가르치는 1단계다.
4.3 2단계 — 둘 중 뭐가 더 나은지 고르게 하기 (선호도 파인튜닝)
망가지는 장면
SFT는 '대화하는 법'은 가르치지만 '어떤 대화가 좋은지'는 안 가르친다.
누가 나쁜 글을 써달라고 하면? 사람마다 '좋은 답' 기준도 다르다.
그래서 2단계가 필요하다.
핵심 요령 — 점수 대신 비교
"이 답 몇 점?"이라고 물으면 사람마다 들쭉날쭉하다.
"A랑 B 중 뭐가 더 나아?"라고 물으면 훨씬 일관된다.
그래서 (질문, 더 나은 답, 못한 답) 짝을 모은다.
| 방법 | 한마디로 | 쓰는 곳 |
|---|---|---|
| RLHF | '심판 모델'을 따로 만들어 점수 매김. 복잡하지만 유연 | 인스트럭트GPT, 라마2 |
| DPO | 심판 없이 비교 데이터로 바로 학습. 단순 | 라마3 |
| RLAIF | 사람 대신 AI가 비교를 판단 | 클로드(Claude) |
메타는 복잡한 RLHF(라마2)에서 단순한 DPO(라마3)로 갈아탔다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 둘 중 나은 걸 고르게 함 | learn([(질문, 나은답, 못한답), ...]) |
'보편적 좋음'을 수식 하나로 못 담음 |
한 걸음 더 ▸ (지금 몰라도 됨) — 판단이 생성보다 쉬워서, 약한 모델도 강한 모델의 답을 채점할 수 있다. 강화 학습 없이 심판 점수 높은 답만 골라 쓰는 'Best of N' 방식만 쓰는 회사도 있다(스티치 픽스, 그랩).
한 문장 정의 — 2단계는 '점수' 대신 '둘 중 비교'로 사람 취향을 가르친다. RLHF·DPO·RLAIF가 그 방법이다.
5. 답을 어떻게 고르나 — 샘플링
5.1 모델은 답을 '뽑는다'
기본 장면
모델은 다음 단어를 딱 정해 두지 않는다.
후보 단어마다 확률을 매기고, 그중에서 뽑는다.
"내가 좋아하는 색은 ___"에서 green 50%, red 30% 식으로 확률이 매겨지면, green이 절반 확률로 뽑힌다.
(엄밀히는 신경망이 '로짓'이라는 원점수를 내고, 소프트맥스라는 계산으로 확률로 바꾼다. 분위기만 알면 된다.)
왜 매번 가장 높은 것만 안 고를까?
항상 1등만 고르면(그리디) 답이 지루해진다.
늘 가장 흔한 단어만 나오니, 다섯 살 아이 말투가 된다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 가중치 다른 제비뽑기 | pick(green=0.5, red=0.3) |
매번 답이 달라질 수 있음 |
한 문장 정의 — 모델은 후보 단어의 확률을 매겨 뽑으며, 이 뽑기가 창의성도 비일관성도 만든다.
5.2 온도 — 뻔함과 엉뚱함 조절
비유 먼저
온도(이 장 새 단어 참고)는 손잡이 하나다.
낮추면 늘 가장 무난한 답(뻔함), 높이면 가끔 튀는 답(엉뚱함).
예시 폭격
예시 ① (완성예) — 후보 A, B의 원점수가 [1, 2]일 때: 온도 1.0 → 확률 [0.27, 0.73] 온도 0.5 → 확률 [0.12, 0.88] (B 쪽으로 더 쏠림 = 더 뻔해짐)
예시 ② (부분완성) — 빈칸: 코드 생성·의료처럼 정확함이 중요하면 온도를 ___ 게. 정답: 낮게.
| 온도 | 효과 | 어디 쓰나 |
|---|---|---|
| 낮음 (<1) | 무난하고 일관됨 | 코드 생성, 의료 보조 |
| 높음 (>1) | 다양하고 창의적 | 광고 카피, 소설 초안 |
| 0에 가까움 | 늘 1등만 (그리디) | 일관성 최우선 |
창의 작업엔 보통 0.7을 권한다. 업체들은 대개 0~2 범위로 막아 둔다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 주사위에 손대기 | ask(..., temperature=0.2) 뻔함 |
너무 높이면 헛소리 늘어남 |
한 문장 정의 — 온도는 답을 뻔하게(낮음) 또는 엉뚱하게(높음) 만드는 손잡이다.
5.3 top-k와 top-p — 후보를 몇 개만 추리기
후보 단어가 너무 많으면 계산이 무겁다.
그래서 후보를 추린다. 두 방식이 있다.
top-k — 개수로 자르기
"상위 k개(예: 50개)만 후보로 두자." 개수가 고정이다.
top-p — 누적 확률로 자르기
"확률 높은 것부터 더해서 90%(p) 채울 만큼만 후보로 두자." 개수가 상황 따라 변한다.
예시 폭격 — top-p
후보가 yes 60%, maybe 31%, no 8%일 때: top-p=0.9 → yes+maybe(91%)까지만 고려 top-p=0.99 → no까지 고려
"예/아니오" 질문엔 자연히 후보가 적어지고, 열린 질문엔 많아진다. 똑똑하다.
| 구분 | top-k | top-p |
|---|---|---|
| 자르는 기준 | 개수 k개 고정 | 누적 확률 p까지 |
| 쉬운 질문 | 그래도 k개 | 자연히 적어짐 |
| 권장값 | 50~500 | 0.9~0.95 |
| 비유 | 코드 | 위험 |
|---|---|---|
| 상위 N명만 후보 (top-k) | pick(top_k=50) |
질문 난이도와 무관하게 고정 |
| 90% 채울 만큼만 (top-p) | pick(top_p=0.9) |
계산 부담이 꼭 줄진 않음 |
언제 멈출까 (중단 조건) — 토큰 수 한도나 '끝 신호 토큰'으로 멈춘다. 너무 일찍 끊기면 JSON 닫는 괄호가 빠지는 사고가 난다.
한 문장 정의 — top-k는 후보를 개수로, top-p는 누적 확률로 추려 적당히 다양하게 만든다.
5.4 여러 번 뽑아 제일 나은 걸 고르기 — 테스트 시점 연산
아이디어
답을 한 번만 뽑지 말고, 여러 번 뽑아서 제일 나은 걸 고르자.
이걸 테스트 시점 연산(Best of N)이라 한다.
제일 나은 걸 고르는 법 (예시 폭격)
- 가장 확률 높은 답 고르기 (오픈AI의 best_of)
- 심판 모델 점수로 고르기
- 다수결 — 수학·객관식에 좋다. 구글은 시험 볼 때 문제당 32번 풀려 가장 많이 나온 답을 택했다
- 더 짧은 답, 또는 유효한 SQL만 고르기
효과가 얼마나?
심판을 써서 고르는 게, 모델을 30배 키운 것과 맞먹는 성능을 냈다 (오픈AI, Cobbe et al., 2021).
단, 끝없이 늘리면 안 된다. 오픈AI 실험에선 400개까지만 좋아지고 그 뒤엔 오히려 심판을 속이는 답이 늘었다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 여러 개 써 보고 best 고르기 | outs = [gen() for _ in range(N)]; pick_best(outs) |
N 만큼 비용도 늘어남 |
예시 폭격 ② — 흐릿한 이미지에서 글자를 읽을 때, 한 번에 절반밖에 못 읽던 걸 세 번 시도하니 거의 다 읽었다.
한 문장 정의 — 테스트 시점 연산은 답을 여러 번 뽑아 제일 나은 걸 골라 품질을 올리는 방법이다.
5.5 정해진 형식으로 뽑게 하기 — 구조화 출력
망가지는 장면
답을 다음 프로그램에 넘겨야 하는데, 모델이 JSON을 삐뚤게 뱉어 파싱이 깨진다.
JSON·SQL처럼 정해진 형식이 꼭 필요한 일이 있다.
형식을 지키게 만드는 5가지 (가벼운 것 → 강한 것)
| 방법 | 한마디로 | 효과 |
|---|---|---|
| 프롬프팅 | "JSON으로 줘"라고 시킴. 단순·저비용 | 낮음~중간 |
| 후처리 | 모델이 자주 하는 실수를 스크립트로 교정. 링크드인은 이걸로 90%→99.99% | 중간 |
| 테스트 시점 연산 | 형식 맞을 때까지 다시 뽑기 | 중간 |
| 제약 샘플링 | 형식에 맞는 단어만 뽑게 강제. 강하지만 형식마다 문법 필요 | 높음 |
| 파인튜닝 | 원하는 형식 예시로 모델을 아예 가르침 | 가장 높음 |
| 비유 | 코드 | 위험 |
|---|---|---|
| "양식에 맞춰 적어줘" 부탁 (프롬프팅) | ask("JSON 으로 답해") |
안 지킬 수 있음 |
| 틀린 칸만 손으로 고침 (후처리) | fix_missing_bracket(output) |
쉬운 실수만 고침 |
예시 폭격 — 빈칸: 가장 단순하지만 가장 안 미더운 방법은 ___. 정답: 프롬프팅.
한 문장 정의 — 구조화 출력은 프롬프팅→후처리→제약 샘플링→파인튜닝 순으로 형식을 점점 강하게 강제한다.
6. 확률적이라 생기는 두 골칫거리 — 비일관성과 환각
6.1 같은 질문, 다른 답 — 비일관성
망가지는 장면
같은 글을 챗GPT에 두 번 채점시켰는데, 한 번은 3/5, 한 번은 5/5가 나왔다.
뽑기로 답을 고르니, 같은 질문에도 답이 달라진다.
두 모습이 있다.
① 같은 입력 → 다른 답.
② 살짝 다른 입력(대문자 하나 차이) → 완전히 다른 답.
달래는 법 (예시 폭격)
예시 ① — 같은 답을 저장해 두고 재사용(캐싱), 온도·top-p·top-k·시드 고정.
예시 ② — 단, 100%는 못 막는다. 하드웨어가 다르면 결과도 미세하게 달라진다.
# 변수 고정으로 일관성을 높임 (완벽 보장은 아님)
# `ask(..., temperature`에 중간 결과를 담아 다음 줄에서 재사용합니다.
ask(..., temperature=0, seed=42)
| 비유 | 코드 | 위험 |
|---|---|---|
| 만날 때마다 이름 다르게 말하는 사람 | ask(q) 두 번 → 다른 답 |
사용자 신뢰가 깨짐 |
한 문장 정의 — 뽑기 때문에 같은 질문에도 답이 달라지며, 변수 고정으로 줄이되 완전히는 못 막는다.
6.2 그럴듯한 거짓말 — 환각
환각(0장 용어집 참고)은 사실 아닌 걸 그럴듯하게 지어내는 현상이다.
2023년 6월, 한 로펌이 챗GPT가 지어낸 가짜 판례를 법원에 냈다가 벌금을 물었다.
환각이 왜 생기는지 두 가설이 있다.
가설 1 — 자기 기만 (딥마인드)
모델은 자기가 방금 한 말을 '주어진 사실'처럼 믿어 버린다.
"칩 후옌은 건축가다"라고 한 번 뱉으면, 그 다음부턴 그걸 사실로 깔고 더 지어낸다.
잘못된 첫 단추가 눈덩이처럼 불어난다.
예시 — GPT-4가 "9677 = 13 × 745(틀림)"라고 한 번 말한 뒤, 9677이 13으로 안 나뉜다는 걸 알면서도 처음 주장을 끝까지 우겼다.
가설 2 — 아는 것의 어긋남 (오픈AI)
SFT 때 작업자가 '모델은 모르는 지식'으로 답을 쓰면, 모델은 그걸 따라 하다 사실상 '지어내기'를 배운다.
| 구분 | 자기 기만 | 아는 것의 어긋남 |
|---|---|---|
| 언제 생기나 | 처음 학습 때 | SFT 때 |
| 원인 | 자기 말을 사실로 믿음 | 작업자 지식 > 모델 지식 |
| 달래는 법 | 내 말과 주어진 사실 구분하게 학습 | 답에 출처 찾게 시키기, 지어내면 벌점 |
실무에서 줄이는 법 (예시 폭격)
예시 ① — "확실히 모르면 '모르겠습니다'라고 해" 프롬프트.
예시 ② — 답을 짧게 시키기 (지어낼 토큰이 적어짐).
| 비유 | 코드 | 위험 |
|---|---|---|
| 모르면서 아는 척 술술 | ask("관련 판례?") → 없는 사건 만듦 |
사실 작업에선 치명적 |
한 걸음 더 ▸ (지금 몰라도 됨) — 흥미롭게도 RLHF가 환각을 오히려 늘렸다는 결과도 있다. 그래도 다른 면이 좋아져서 사람들은 RLHF 모델을 더 선호했다. 두 가설은 서로 보완적이다 — 하나는 처음 학습이, 다른 하나는 SFT가 환각을 만든다고 본다.
한 문장 정의 — 환각은 모델이 사실 아닌 걸 지어내는 현상이며, 자기 기만과 아는 것의 어긋남 두 가설로 설명된다.
정리
이 장의 네 줄기를 한 줄씩.
- 데이터 — 모델은 배운 것만 한다. 인터넷은 영어 절반이라 영어를 제일 잘하고, 데이터 적은 언어는 못한다.
- 속(아키텍처) — 요즘 모델 속은 트랜스포머. 심장은 어텐션 하나. 단점은 긴 글이 무겁다는 것.
- 다듬기(사후 학습) — 갓 배운 모델은 거칠다. 좋은 답 보여 주기(SFT) → 둘 중 비교(선호도)로 두 번 다듬는다.
- 뽑기(샘플링) — 답은 확률로 뽑는다. 온도·top-k·top-p로 조절. 이 뽑기가 창의성도, 비일관성·환각도 만든다.
다음 3장 예고 1줄. 잘 만들었는지 채점하는 일(평가)을 본다. (지금 몰라도 됩니다 — 3장에서 풀려요.)
연습문제
- 설명.
거대 모델은 어떻게 만들어지나의 핵심을 처음 듣는 사람에게 한 문장으로 설명하라. - 구분. 두 개념(
사전 학습,사후 학습)을 실제 예시 하나로 구분하라. - 적용. 내 프로젝트나 학습 노트에서 이 장의 개념을 적용해 작게 개선할 지점을 하나 고르라.
부록 A. 쉬운 용어 사전
| 용어 | 아주 쉬운 뜻 | 이 장에서 나온 위치 |
|---|---|---|
| 사전 학습 | 큰 모델이 기본 언어 능력과 패턴을 배우는 첫 학습 단계. | 부록 B와 본문 예시 |
| 사후 학습 | 사전 학습 뒤 사람 지시와 안전 기준에 맞게 다듬는 단계. | 부록 B와 본문 예시 |
| 샘플링 | 여러 가능한 다음 단어 중 하나를 고르는 답변 생성 방식. | 부록 B와 본문 예시 |
| 결정적 출력 | 같은 입력이면 되도록 같은 답을 내도록 설정한 출력 방식. | 부록 B와 본문 예시 |
부록 B. 헷갈리는 개념 비교표
| A | B | 구분 포인트 |
|---|---|---|
| 사전 학습 | 사후 학습 | 사전 학습은 기본 능력 만들기, 사후 학습은 사람 지시에 맞게 다듬기다. |
| 샘플링 | 결정적 출력 | 샘플링은 여러 가능성 중 고르고, 결정적 출력은 같은 입력에 같은 답을 노린다. |
부록 C. 더 읽을 자료
- 이 장의
더 해보기섹션 — 이미 모아 둔 공식 문서나 실습 링크가 있으면 여기서 먼저 확인한다. - 같은 책의
0장 한눈에 보기— 용어가 막히면 0장의 용어집과 개념 척추로 돌아간다. - 원본 딥다이브판 같은 장 — 입문판을 읽고 큰 흐름이 잡힌 뒤 세부 논리를 더 깊게 확인한다.
- 이 장의
flashcards.json— 읽은 직후 질문만 보고 답을 떠올리는 회상 연습에 쓴다.
부록 D. 연습문제 풀이
- 설명 예시.
거대 모델은 어떻게 만들어지나는 거대 모델을 제품에 넣을 때 어떤 선택을 하고 어떻게 확인할지 판단하게 해 주는 장이다. 중요한 것은 용어를 외우는 것이 아니라, 이 개념이 어떤 입력·부품·결정에 영향을 주는지 말로 풀어 보는 것이다. - 구분 예시. 두 개념(
사전 학습,사후 학습)의 차이는 이렇게 잡으면 된다. 사전 학습은 기본 능력 만들기, 사후 학습은 사람 지시에 맞게 다듬기다. 실제 사례를 볼 때는 목적, 입력, 실패했을 때의 증상을 따로 적어 보면 헷갈리지 않는다. - 적용 예시. 가장 작은 개선부터 고른다. 예를 들어 이름을 더 분명히 하거나, 평가 기준을 한 줄 추가하거나, 직접 알 필요 없는 내부 정보를 감추는 식으로 시작한다. 한 번에 크게 갈아엎는 것보다 작은 변경 하나를 확인하며 진행하는 쪽이 입문 단계에 맞다.
클릭하거나 Space를 눌러 뒤집기